package net.zigin.nhi.could.waste.service.impl;

import net.zigin.commons.util.AssertUtil;
import net.zigin.commons.util.ParamsMapUtil;
import net.zigin.commons.util.ReflectUtil;
import net.zigin.commons.util.StringUtil;
import net.zigin.nhi.could.waste.aop.LoginAspect;
import net.zigin.nhi.could.waste.vo.TokenInfoBo;
import net.zigin.nhi.could.waste.dao.*;
import net.zigin.nhi.could.waste.dto.MaterialApplyDto;
import net.zigin.nhi.could.waste.exception.EpiCloudException;
import net.zigin.nhi.could.waste.model.MaterialBase;
import net.zigin.nhi.could.waste.model.MaterialRecord;
import net.zigin.nhi.could.waste.vo.MaterialApplyVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import net.zigin.nhi.could.waste.model.MaterialApply;
import net.zigin.nhi.could.waste.service.MaterialApplyService;

import java.util.Date;
import java.util.List;
import java.util.Map;

/*#################################################################*
# 说明:以下代码通过哲勤代码生成工具自动生成    
# 工具:GeneratorCode
# 作者:mgw1986                                                  
# 生成时间:2021-9-12 21:08:10                                               
##################################################################*/


/**
 * MaterialApply服务实现类
 *
 * @author mgw1986
 * @version V1.0
 * @ClassName: MaterialApplyServiceImpl
 * @date 2021-9-12 21:08:10
 */
@Service
public class MaterialApplyServiceImpl extends AbstractServiceImpl<MaterialApply, String> implements MaterialApplyService {
    @Autowired
    private MaterialApplyMapper materialApplyMapper;
    @Autowired
    private SysUserHospitalMapper sysUserHospitalMapper;
    @Autowired
    private MaterialRecordMapper materialRecordMapper;
    @Autowired
    private MaterialBaseMapper materialBaseMapper;

    @Override
    public BaseMapper<MaterialApply, String> getMapper() {
        return materialApplyMapper;
    }

    @Override
    public String saveOrUpdate(MaterialApplyDto materialApplyDto) {
        AssertUtil.isNull(materialApplyDto, "");
        TokenInfoBo tokenInfo = LoginAspect.getTokenInfo();
        materialApplyDto.setHospitalBaseId(sysUserHospitalMapper.getHospitalBaseIdBySysUserId(tokenInfo.getUserId()));
        if (StringUtil.isNullOrEmpty(materialApplyDto.getId())) {
            AssertUtil.isNull(materialApplyDto.getMaterialBaseId(), "");
            AssertUtil.isNull(materialApplyDto.getHospitalDepartId(), "");
            AssertUtil.isNull(materialApplyDto.getUserStaffId(), "");
            MaterialBase materialBase = materialBaseMapper.selectByPrimaryKey(materialApplyDto.getMaterialBaseId());
            if (materialBase.getReserve() < materialApplyDto.getApplyNum()) {
                throw new EpiCloudException("当前库存不足！库存：" + materialBase.getReserve() + " ,单位：" + materialBase.getUnit());
            }
            materialApplyDto.setId(StringUtil.get32UUID());
            materialApplyDto.setCreateUser(tokenInfo.getLoginName());
            materialApplyDto.setCreateTime(new Date());
            materialApplyDto.setModifyTime(new Date());
            MaterialApply materialApply = ReflectUtil.copyProperties(materialApplyDto, MaterialApply.class);
            materialApplyMapper.insert(materialApply);
            // 修改 materialBase reserve
            materialBase.setReserve(materialBase.getReserve() - materialApplyDto.getApplyNum());
            // 判断最低库存
            materialBase.setReserveMin(Math.min(materialBase.getReserve(), materialBase.getReserveMin()));
            materialBaseMapper.updateByPrimaryKeySelective(materialBase);
            // 生成入库记录
            outStorage(materialApply, materialBase.getReserve());
            return materialApply.getId();
        } else {
            // 正常来说 编辑用不到的
            materialApplyDto.setModifyUser(tokenInfo.getLoginName());
            materialApplyDto.setModifyTime(new Date());
            MaterialApply materialApply = ReflectUtil.copyProperties(materialApplyDto, MaterialApply.class);
            materialApplyMapper.updateByPrimaryKeySelective(materialApply);
            return materialApply.getId();
        }
    }

    @Override
    public List<MaterialApplyVo> getList(MaterialApplyDto materialApplyDto) {
        Map<String, Object> paramMap = getMaterialApplyParam(materialApplyDto);
        return materialApplyMapper.getInfoPageByCondition(paramMap);
    }

    @Override
    public Integer getCount(MaterialApplyDto materialApplyDto) {
        Map<String, Object> paramMap = getMaterialApplyParam(materialApplyDto);
        return materialApplyMapper.selectCount(paramMap);
    }

    @Override
    public MaterialApplyVo getInfoById(String id) {
        return materialApplyMapper.getInfoById(id);
    }

    private void outStorage(MaterialApply materialApply, int reverse) {
        MaterialRecord materialRecord = new MaterialRecord(materialApply);
        // todo 数量 change before after
        materialRecord.setChangeNum(materialApply.getApplyNum());
        materialRecord.setBeforeNum(materialApply.getApplyNum() + reverse);
        materialRecord.setAfterNum(reverse);
        materialRecordMapper.insert(materialRecord);

    }

    private Map<String, Object> getMaterialApplyParam(MaterialApplyDto materialApplyDto) {
        TokenInfoBo tokenInfo = LoginAspect.getTokenInfo();
        materialApplyDto.setHospitalBaseId(sysUserHospitalMapper.getHospitalBaseIdBySysUserId(tokenInfo.getUserId()));
        return ParamsMapUtil.getInstance()
                .addParam("hospitalBaseId", materialApplyDto.getHospitalBaseId())
                .addParam("userStaffId", materialApplyDto.getUserStaffId())
                .addParam("hospitalDepartId", materialApplyDto.getHospitalDepartId())
                .addParam("materialBaseCode", materialApplyDto.getMaterialBaseCode())
                .addParam("pageSize", materialApplyDto.getPageSize())
                .addParam("pageIndex", materialApplyDto.getPageIndex());
    }
}